package com.sprouting.ops.task;

import cn.hutool.core.collection.CollUtil;
import com.sprouting.ops.interfaces.ConstantBase;
import com.sprouting.ops.model.DromaraFileStorage;
import com.sprouting.ops.service.DromaraFileStorageService;
import lombok.extern.slf4j.Slf4j;
import org.dromara.x.file.storage.core.FileInfo;
import org.dromara.x.file.storage.core.FileStorageService;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;

/**
 * 定时清理上传文件
 *
 * @author ：LX（长沙麓谷）
 * @date 创建时间： 2024/1/5 18:12
 */
@Component
@Slf4j
public class CleanUploadedFile {

    @Resource
    private DromaraFileStorageService dromaraFileStorageService;
    @Resource
    private FileStorageService fileStorageService;

    @Scheduled(cron = "0/60 * * * * ?")
    // 间隔5秒执行一次
    // @Scheduled(fixedDelay = 5000)
    public void myMethod() {
        log.info("[定时清理上传文件] 开始任务。");

        List<DromaraFileStorage> cleanProductList = dromaraFileStorageService.getCleanFile(new Date());
        if (CollUtil.isNotEmpty(cleanProductList)){
            log.info("[定时清理上传文件] 需要删除的生产文件有 {} 条", cleanProductList.size());
            delFile(cleanProductList);
        }

    }

    /**
     * 删除文件
     * @param cleanTempList 要删除的文件
     */
    public void delFile(List<DromaraFileStorage> cleanTempList){
        for (DromaraFileStorage opsUploadFile : cleanTempList) {
            // 删除物理文件
            FileInfo fileInfo = dromaraFileStorageService.toFileInfo(opsUploadFile);
            fileStorageService.delete(fileInfo);
            log.info("[定时清理上传文件] 物理删除临时文件： {} ", opsUploadFile.getFilename());

            // 逻辑删除数据，这里如果实现了 FileRecorder，则不需要调用这了，直接就会去执行删除操作，但我这里没实现这个接口，需要手动去执行。但原来的逻辑不符合我需求，所以不这样做
            dromaraFileStorageService.removeById(opsUploadFile);
        }
    }
}
